#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 09_Pandas_Correlation_Analysis.py
@time: 2025/2/13  14:33
# @describe: Pandas 相关性分析
"""

"""
相关性分析是数据分析中常见且重要的一步，它帮助我们理解数据中不同变量之间的关系。
在 Pandas 中，数据相关性分析是通过计算不同变量之间的相关系数来了解它们之间的关系。
在 Pandas 中，数据相关性是一项重要的分析任务，它帮助我们理解数据中各个变量之间的关系。
Pandas 提供了多种方法来计算和分析数据的相关性，常见的相关性方法包括皮尔逊相关系数（Pearson）、斯皮尔曼等级相关系数（Spearman）以及肯德尔秩相关系数（Kendall）。
以下相关性方法可以帮助我们揭示变量之间的线性关系、非线性关系或单调关系：

    皮尔逊相关系数：衡量变量之间的线性关系，适用于数值型变量。
    斯皮尔曼等级相关系数：衡量变量之间的单调关系，适用于数值型和顺序型变量。
    肯德尔秩相关系数：衡量变量之间的秩次关系，适用于小样本数据。
    相关性矩阵：用来查看各个变量之间的相关性。
    热图：一种有效的可视化方式，可以帮助我们直观地查看变量之间的相关性。
    
什么是相关性？
    相关性表示两个或多个变量之间的关系强度和方向。根据相关性的数值，可以判断变量之间的关系。

    正相关：当一个变量增加时，另一个变量也增加。例如，身高和体重之间可能存在正相关关系。
    负相关：当一个变量增加时，另一个变量减少。例如，气温和取暖的使用量之间可能存在负相关关系。
    无相关性：两个变量之间没有明确的关系。
    
相关性的数值范围通常在 -1 到 1 之间：
    1：完全正相关
    -1：完全负相关
    0：没有线性相关性
    接近 1 或 -1：表示强相关
    接近 0：表示弱相关
    
    
相关性分析中的应用：
    1、特征选择：
        在机器学习建模中，相关性分析常常用于特征选择。通过分析不同特征之间的相关性，可以帮助我们选择与目标变量最相关的特征，并去除与其他特征高度相关的冗余特征，从而提高模型的表现和效率。
    2、处理多重共线性：
    如果两个或多个特征之间的相关性非常高（接近 1 或 -1），那么这些特征之间存在多重共线性问题。在回归分析中，多重共线性会导致模型的不稳定性和预测不准确。可以通过删除或合并相关性较高的特征来解决多重共线性问题。
"""


"""
Pandas 中计算相关性的方法
Pandas 提供了 DataFrame.corr() 和 DataFrame.cov() 方法来计算相关性和协方差。

Pandas 使用 corr() 方法计算数据集中每列之间的关系。

df.corr(method='pearson', min_periods=1)
    参数说明：
        method (可选): 字符串类型，用于指定计算相关系数的方法。默认是 'pearson'，还可以选择 'kendall'（Kendall Tau 相关系数）或 'spearman'（Spearman 秩相关系数）。
        min_periods (可选): 表示计算相关系数时所需的最小观测值数量。默认值是 1，即只要有至少一个非空值，就会进行计算。如果指定了 min_periods，并且在某些列中的非空值数量小于该值，则相应列的相关系数将被设为 NaN。
        df.corr() 方法返回一个相关系数矩阵，矩阵的行和列对应数据框的列名，矩阵的元素是对应列之间的相关系数。

常见的相关性系数包括 Pearson 相关系数和 Spearman 秩相关系数：
    Pearson 相关系数
    Pearson 即皮尔逊相关系数，用于衡量了两个变量之间的线性关系强度和方向，它的取值范围在 -1 到 1 之间，其中 -1 表示完全负相关，1 表示完全正相关，0 表示无线性相关。
"""

import pandas as pd

data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)
# 计算皮尔逊相关系数
correlation = df.corr(method="pearson")
print(correlation)


"""
斯皮尔曼等级相关系数（Spearman Correlation）
    斯皮尔曼相关系数用于衡量两个变量的单调关系（无论是线性还是非线性），它是基于变量的排名计算的。
    斯皮尔曼相关系数的取值范围与皮尔逊相关系数相同：-1 到 1。
"""
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)

# 计算斯皮尔曼等级相关系数
spearman_correlation = df.corr(method="spearman")
print(spearman_correlation)




"""
    肯德尔秩相关系数（Kendall Correlation）
        肯德尔秩相关系数也用于衡量变量之间的单调关系，它是通过计算两个变量排名之间的一致性来得出的。
        肯德尔相关系数的计算较为复杂，适用于较小的数据集。
"""
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)
# 计算肯德尔秩相关系数
kendall_correlation = df.corr(method="kendall")
print(kendall_correlation)


""" 
相关性矩阵
    相关性矩阵是一个对称矩阵，矩阵中的每个值表示两个变量之间的相关系数。
    可以通过 corr() 方法直接计算 DataFrame 中所有变量的相关性矩阵。
"""
import pandas as pd
import numpy as np

# 添加随机噪声（避免完全线性相关）
np.random.seed(0)
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': 2 * np.array([20, 25, 30, 35, 40]) + 5 + np.random.randn(5),  # 添加噪声
    'Age': [20, 25, 30, 35, 40]
}

df = pd.DataFrame(data)
print("修改后的数据：")
print(df)

# 计算相关性矩阵
correlation_matrix = df.corr()
print("\n相关性矩阵：")
print(correlation_matrix)



"""
相关性热图（Correlation Heatmap）
    为了更直观地呈现相关性矩阵，可以使用热图（Heatmap）来可视化各个变量之间的相关性。
    使用 seaborn 库绘制相关性热图是一个常见的做法。
"""
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)
# 绘制相关性热图
plt.figure(figsize=(8, 6))

# sns.heatmap() 绘制相关性热图，annot=True 表示在热图上显示数值，cmap='coolwarm' 设置颜色范围，vmin=-1, vmax=1 限制颜色范围为 -1 到 1。
sns.heatmap(df.corr(), annot=True, cmap="coolwarm", fmt=".2f", vmin=-1, vmax=1)
plt.title("Correlation Heatmap")
plt.show()



""" 
    可视化相关性：
     Seaborn 是一个基于 Matplotlib 的数据可视化库，专注于统计图形的绘制，旨在简化数据可视化的过程。
    Seaborn 提供了一些简单的高级接口，可以轻松地绘制各种统计图形，包括散点图、折线图、柱状图、热图等，而且具有良好的美学效果
"""
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 创建一个示例数据框
data = {'A': [1, 2, 3, 4, 5], 'B': [5, 4, 3, 2, 1]}
df = pd.DataFrame(data)
print(df)

# 计算 Pearson 相关系数
correlation_matrix = df.corr()
# 使用热图可视化 Pearson 相关系数-
# 生成一个热图，用颜色表示相关系数的强度，其中正相关用温暖色调表示，负相关用冷色调表示。annot=True 参数在热图上显示具体的数值。
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f")

